package com.example.drzhang.oengldemo.render;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLES20;
import android.opengl.GLUtils;
import android.util.Log;

/**
 * Created by drzhang on 2018/1/10.
 */

public class TextureHelper {

    /**
     * 纹理的过滤： 当纹理对象和目标对象大小匹配不一致的时候，为了使纹理充满目标对象，会发生纹理的放大或缩小，因此需要一定的过滤方式来处理这些情况
     * 常见的有如下两种：
     * 1 最近邻过滤：即为每个片段选取最近邻的纹理元素，这种方式放大之后会有明显的锯齿效果；
     * 2 双线性过滤：使用双线性插值方式 平滑 过渡相邻像素，这种方式会平滑过滤
     *
     * 缩小：
     *  GLES20.GL_NEAREST
        GLES20.GL_NEAREST_MIPMAP_LINEAR;
        GLES20.GL_NEAREST_MIPMAP_NEAREST;
        GLES20.GL_LINEAR_MIPMAP_NEAREST;
        GLES20.GL_LINEAR;
        GLES20.GL_LINEAR_MIPMAP_LINEAR;
     *
     * 放大：
     * GLES20.GL_NEAREST
       GLES20.GL_LINEAR;
     */


    public static final String TAG = TextureHelper.class.getSimpleName();

    public static int  loadTexture(Context context, int resourceId){
        //创建一个新的纹理对象
        int[] textObjectsId = new int[1];
        GLES20.glGenTextures(1, textObjectsId,0);
        if (textObjectsId[0] == 0){
            Log.e(TAG,"create texture fail");
            return 0;
        }

        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId,options);
        if (bitmap == null){
            Log.e(TAG, "load resource texture fail");
            GLES20.glDeleteTextures(1,textObjectsId,0);
            return 0;
        }

        //绑定该纹理对象到程序中
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textObjectsId[0]);
        //添加纹理过滤方式
        //缩小时使用三线性过滤
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR_MIPMAP_LINEAR);
        //放大的时候使用双线性过滤
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);

        //读入位图数据，并将它复制到创建的纹理对象
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D,0,bitmap,0);
        //回收bitmap
        bitmap.recycle();

        //设置生成mip贴图的级别
        GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
        //解除纹理绑定
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);

        //返回纹理对象
        return textObjectsId[0];
    }
}
